#ifndef __USART_H
#define __USART_H

#include <stdio.h>
#include <stdint.h>

#define USART0_RX_BUFF_SIZE				2048						/* 串口0 数据接收缓冲区大小 */
#define USART0_TX_BUFF_SIZE				1024						/* 串口0 数据发送缓冲区大小 */
#define USART0_RX_MAX					256							/* 串口0 单次数据接收最大值 */
#define USART0_DMA_TRANSFER_SIZE		(USART0_RX_MAX + 1)			/* 串口0 DMA参数数据量 */

#define USART2_RX_BUFF_SIZE				2048						/* 串口2 数据接收缓冲区大小 */
#define USART2_TX_BUFF_SIZE				1024						/* 串口2 数据发送缓冲区大小 */
#define USART2_RX_MAX					256							/* 串口2 单次数据接收最大值 */
#define USART2_DMA_TRANSFER_SIZE		(USART2_RX_MAX + 1)			/* 串口2 DMA参数数据量 */

#define RX_BUFF_SE_LIST_SIZE			10							/* 缓冲区数据帧读写的起止位置列表长度 */

/* 缓冲区数据帧读写的起止位置 */
typedef struct {
	uint8_t *start;
	uint8_t *end;
} usart_rx_se_struct; 

/* 串口接收数据缓冲区存取数据控制体 */
typedef struct {
	uint16_t rx_byte_counter;										/* 累计接收的数据量 */
	usart_rx_se_struct rx_buff_se_list[RX_BUFF_SE_LIST_SIZE];		/* 缓冲区数据帧读写的起止位置列表 */
	usart_rx_se_struct *rx_buff_write;								/* 缓冲区数据帧写入的起止位置 */
	usart_rx_se_struct *rx_buff_read;								/* 缓冲区数据帧读出的起止位置 */
	usart_rx_se_struct *rx_buff_se_list_full;						/* 缓冲区数据帧读写的起止位置列表满 */
} usart_rx_control_block_struct;

extern uint8_t usart0_rx_buff[USART0_RX_BUFF_SIZE];
extern usart_rx_control_block_struct usart0_rx_control_block;
extern uint8_t usart2_rx_buff[USART2_RX_BUFF_SIZE];
extern usart_rx_control_block_struct usart2_rx_control_block;
extern uint8_t usart0_rx_frame[USART0_RX_MAX];
extern uint8_t usart2_rx_frame[USART2_RX_MAX];

void gd_hal_usart_init(void);
void usart0_printf(char *format, ...);
void usart2_printf(char *format, ...);
int usart_rx_frame_read(usart_rx_control_block_struct *cb, uint8_t *buff);	
int usart_rx_frame_timeout_read(usart_rx_control_block_struct *cb, uint8_t *buff, uint16_t timeout_ms);
char usart0_getchar(void);
char *usart0_gets(char *buff, uint16_t buff_len);

#endif
